import axios from 'axios';
import Cookies from 'js-cookie';
import NProgress from 'nprogress'
import {
    Notification
} from 'element-ui';
import router from '../router';

// axios 二次封装的目的
// 1. 统一处理请求错误处理和请求时候 需要做些什么 比如请求头中添加token
// 2. 统一处理响应数据
// 3. 管理统一的请求方法

// code 验证 
// http 状态码 一般由后端和前端协商来定
const codeMessage = {
    200: '服务器成功返回请求的数据。',
    201: '新建或修改数据成功。',
    202: '一个请求已经进入后台排队（异步任务）。',
    204: '删除数据成功。',
    400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
    401: '用户没有权限（令牌、用户名、密码错误）。',
    403: '用户得到授权，但是访问是被禁止的。',
    404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
    406: '请求的格式不可得。',
    410: '请求的资源被永久删除，且不会再得到的。',
    422: '当创建一个对象时，发生一个验证错误。',
    500: '服务器发生错误，请检查服务器。',
    502: '网关错误。',
    501: '网络错误信息。',
    503: '服务不可用，服务器暂时过载或维护。',
    504: '网关超时。',
};

// 请求超时 6s
axios.defaults.timeout = 6000;

// 基准路径
// axios.defaults.baseURL = '/api';

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么

    // 请求头中添加 token
    // 一般在公司 是没有的
    // 因为我们把token 存储到cookie里面 cookie 会在请求的时候自动 将token存储到请求头
    config.headers['Authorization'] = Cookies.get('token') || ''

    // 请求的时候触发loding 开始
    NProgress.start();

    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器
axios.interceptors.response.use(responseCodes, responseError);

// 响应成功后 触发的方法
function responseCodes(response) {
    // 对响应数据做点什么
    // 响应的时候 关闭
    NProgress.done();

    // 先判断 请求的状态码是不是 200
    if (response.status >= 200 && response.status <= 300) {
        // 用element 全局错误提示
        // Notification.success({
        //     title: response.data.code,
        //     message: `成功信息为：${response.data.message}`,
        // });

        return response;
    }

    // 如果不是 200 就弹出错误信息
    // codeMessage[200] = '服务器成功返回请求的数据。'
    // codeMessage[406] = '请求的格式不可得。'
    // codeMessage[600] = 

    const errorText = codeMessage[response.status] || response.statusText;

    // 弹出错误信息
    // 抛出错误
    const error = new Error(errorText);

    // 用element 全局错误提示
    Notification.error({
        title: response.data.code,
        message: `错误信息为：${errorText}`,
    });

    error.name = response.data.code;
    throw error;

}

// 响应失败后 触发的方法
function responseError(error) {

    console.log(error)
    if (error.response.status >= 400 && error.response.status < 500) {
        // 400 500 之间的错误
        router.push('/404');
    }
    if (error.response.status >= 500) {
        // 500 之间的错误
        router.push('/500');
    }
    // 对响应错误做点什么
    return Promise.reject(error);
}

// 封装get请求
// @param url 请求地址
// @param params 请求参数
// @returns {Promise}
export const UrlGet = async (url, parmas = {}) => await axios.get(url, {
    parmas
})

// 封装post请求
// @param url 请求地址
// @param params 请求参数
// @returns {Promise}
export const UrlPost = async (url, parmas = {}) => await axios.post(url, parmas)

// 封装put请求
// @param url 请求地址
// @param params 请求参数
// @returns {Promise}
export const UrlPut = async (url, parmas = {}) => await axios.put(url, parmas)

// 封装删除请求
// @param url 请求地址
// @param params 请求参数
// @returns {Promise}
export const UrlDelete = async (url, parmas = {}) => await axios.delete(url, parmas)